<?php 
namespace Framework;
use App\Controllers\ErrorController;
use Framework\Middleware\Authorise;
// $routes = require basePath('routes.php');

// if (array_key_exists($uri, $routes)) {
//     require(basePath($routes[$uri]));
// }else {
//     http_response_code(404);
//     require(basePath($routes['404']));
// }
class Router {
    protected $routes = [];
    private function registerRoute($method,$uri,$action,$middleware=[]){
        list($controller,$controllerMethod) = explode('@',$action);
        
        // inspectAndDie($controllerMethod);
        
        $this->routes[] = [
            'method' => $method,
            'uri' => $uri,
            'controller' => $controller,
            'controllerMethod' => $controllerMethod,
            'middleware' => $middleware
        ];
        
    }

    /**
     * 添加一个GET 路由
     * 
     * @param string $uri
     * @param string $controller
     * @return void
     */
    public function addGet($uri,$controller,$middleware=[]) {
        $this->registerRoute('GET',$uri,$controller,$middleware);

    }

    /**
     * 添加一个POST路由
     * 
     * @param string $uri
     * @param string $controller
     * @return void
     */
    public function addPost($uri,$controller,$middleware=[]) {
        $this->registerRoute('POST',$uri,$controller,$middleware);
    }
    /**
     * 添加一个PUT路由
     * @param string $uri
     * @param string $controller
     * @return
     */
    public function addPut($uri,$controller,$middleware=[]) {
        $this->registerRoute('PUT',$uri,$controller,$middleware);
    }

    /**
     * 添加一个Delete路由
     * 
     * @param string $uri
     * @param string $controller
     * @return void
     */
    public function addDelete($uri,$controller,$middleware=[]){
        $this->registerRoute('DELETE',$uri,$controller,$middleware);
    }


    /**
     * 执行路由
     * @param string $uri
     * @return void
     */
    public function route($uri){
        $requestMethod = $_SERVER['REQUEST_METHOD'];
        // 检查 POST 请求中的特殊字段 ——method
        if ($requestMethod === 'POST' && isset($_POST['_method'])){
            $requestMethod = strtoupper($_POST['_method']);
        }
        //拆分目前URI
        $uriSegments = explode('/',trim($uri,'/'));
        
        foreach($this->routes as $route){
            //拆分路由URI
            $routeSegments = explode('/',trim($route['uri'],'/'));
            $match = false;

            if(count($uriSegments) === count($routeSegments) && strtoupper($route['method'] === $requestMethod)) {
                $params = [];
                $match = true;
                for($i = 0; $i < count($uriSegments); $i++) {
                    //如果有uri不匹配或者参数不存在
                    if($routeSegments[$i] !== $uriSegments[$i] && !preg_match('/\{(.+?)\}/',$routeSegments[$i])){
                        $match = false;
                        break;
                    }

                    // 检查并且提取数字
                    if (preg_match('/\{(.+?)\}/',$routeSegments[$i],$matches)){
                        $params[$matches[1]]=$uriSegments[$i];
                    }
                }
            };
            if ($match) {

                foreach ($route['middleware'] as $middleware){
                    (new Authorise())->handle($middleware);
                }

                $controller = 'App\\Controllers\\' . $route['controller'];
                $controllerMethod = $route['controllerMethod'];
    
                //实例化控制器和调用控制器法
                $controllerInstance = new $controller();
                $controllerInstance->$controllerMethod($params);
                return;
            }
        }

        
        ErrorController::notFound();
    }

    public function error($httpCode = 404){
        http_response_code($httpCode);
        loadView("erroe/{$httpCode}");
        exit;
    }
}
?>